package s2elinshu;

import java.util.ArrayList;

public class J19Generic {

	public static void main(String[] args) {
		
		//고정크기 배열(정적배열)
		//단일 종류의 동물만 넣을 수 있는 타입이 완성
		//호랑이를 가두기 위한 동물원
		Tiger  zoo1[] = new Tiger[3];
		//사자를 가두기 위한 동물원
		Lion  zoo2[] = new Lion[3];
		//얼룩말을 가두기 위한 동물원
		Zibra  zoo3[] = new Zibra[3];
		
		//모든 동물을 한 곳에 모으기 위해선 상속을 이용하는 것이 좋다
		
		//호랑이, 사자, 얼룩말을 가둘 수 있는 동물원
		//호랑이, 사자, 얼룩말은 animal과 상속 관계
		Animal zoo4[] = new Animal[3];
		
		// 상속 관계를 모를 경우 object를 이용
		//호랑이, 사자, 얼룩말뿐만 아니라 언급되지 않은 다른 동물들도
		// 가둘 수 있는 동물원
		// object 클래스는 모든 클래스의 조상
		Object zoo5[] = new Object[3];
		                                                                                                                                                                                            
		
		Animal ani1 = zoo4[1];
		// Lion lion1 = zoo4[1]; animal은 lion의 자손 개념이기에
		// 다운캐스팅을 해야 함
		// animal 객체를 lion 객체에 저장하려면 먼저
		// downcasting을 해야 함
		Lion lion1 = (Lion) zoo4[1];
		// 따라서, downcasting시
		// 명시적으로 변환하려는 자료형을 기술하는 것은 다소 귀찮을 수 있음
		
		
		// 컬렉션 (가변크기 배열)
		// 컬렉션에서는 어떤 종류의 자료를 담을 지 모르기 때문에
		// 최상위 조상객체인 object형태로 저장 및 관리하도록 설계되어 있음
		//JDK 4 이하에서 사용한 코드
		ArrayList zoo6 = new ArrayList();
		zoo6.add(new Tiger());
		zoo6.add(new Lion());
		zoo6.add(new Zibra());
		zoo6.add(new Monkey());
		zoo6.add(new Whale());
		
		
		
		//JDK5 이상에서 사용		
		// generic을 이용하면 프로그래머가 컬렉션에 사용할 객체의 유형을
		//명확하게 지정해서 이 유형과 다른 객체는 저장되지 못하게 함
		//따라서, 컴파일시 오류확인이 빨라짐
		ArrayList<Tiger> zoo7 = new ArrayList<Tiger>();
		zoo7.add(new Tiger());
		//zoo7.add(new Lion()); 
		//zoo7에는 generic으로 tiger만 객체 저장할 수 있도록 한정시킴
		//따라서, 예상치 못한 오류가 발생할 수 있는 가능성은 낮아짐
		
		ArrayList<Lion> zoo8 = new ArrayList<>();
		//JDK7에선 위와같이 사용
		
		zoo1[1] = new Tiger();
		// zoo1[2] = new Zibra();  zoo1엔 호랑이는 가둘 수 있지만 얼룩말은 가둘 수 없음
		
		// 가두는 건 문제가 없는데 빼 낼 때 문제가 발생한다
		zoo4[0] = new Tiger();
		zoo4[1] = new Lion();
		zoo4[2] = new Zibra();
		// zoo4[1] = new Monkey(); 상속관계에 있는 것이 아니기에 집어 넣을 수 없음
		
		
		//object는 상속관계가 아닌 것도 넣을 수 있음
		zoo5[0] = new Tiger();
		zoo5[1] = new Monkey();
		
		
	}  // public static void main
}  // public class J19Generic 


class Animal{}
class Tiger extends Animal{}
class Lion extends Animal{}
class Zibra extends Animal{}
class Monkey{}
class Whale{}



